package com.huaxin.hxmodulemqtt.common;

import com.huaxin.hxjwt.common.JwtHeaderUtils;
import com.huaxin.hxjwt.entity.JwtModel;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;


/**
 * 使用 ThreadLocal 存储当前请求的用户信息。
 * 该信息在请求开始时从 Header 中提取，并在请求结束时清除。
 * 供 MyBatis-Plus MetaObjectHandler 等需要跨组件访问用户信息的工具使用。
 */
public class UserContext {

    private static final Logger log = LoggerFactory.getLogger(UserContext.class);

    // ✅ ThreadLocal 用于存储当前线程（即当前请求）的 JwtModel
    private static final ThreadLocal<JwtModel> currentUser = new ThreadLocal<>();

    /**
     * 从当前请求的 Header 中提取 JwtModel 并存入 ThreadLocal。
     * 应在请求处理的早期（如拦截器中）调用。
     */
    public static void init() {
        try {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
            HttpServletRequest request = attributes.getRequest();

            // ✅ 使用你已有的 JwtHeaderUtils 从 Header 构建 JwtModel
            JwtModel jwtModel = JwtHeaderUtils.getJwtModelFromHeader(request);
            currentUser.set(jwtModel);

            if (log.isDebugEnabled()) {
                log.debug("UserContext initialized: userId={}, orgId={}", jwtModel.getUserId(), jwtModel.getOrgId());
            }
        } catch (Exception e) {
            log.warn("Failed to initialize UserContext from request", e);
            // 即使失败，也设置一个空的 JwtModel 或保持 null
            currentUser.set(new JwtModel()); // 或者 set(null)
        }
    }

    /**
     * 清除当前线程的用户信息。
     * 应在请求处理结束时（如拦截器中）调用，防止内存泄漏。
     */
    public static void clear() {
        currentUser.remove();
    }

    /**
     * 获取当前线程的用户 ID。
     *
     * @return 用户 ID，如果未设置则返回 null
     */
    public static String getCurrentUserId() {
        JwtModel model = currentUser.get();
        return model != null ? model.getUserId() : null;
    }

    /**
     * 获取当前线程的组织 ID。
     *
     * @return 组织 ID，如果未设置则返回 null
     */
    public static String getCurrentOrgId() {
        JwtModel model = currentUser.get();
        return model != null ? model.getOrgId() : null;
    }

    /**
     * 获取当前线程的完整 JwtModel。
     *
     * @return JwtModel，如果未设置则返回 null
     */
    public static JwtModel getCurrentUser() {
        return currentUser.get();
    }
}